package com.hyts.standard.webflux.web.mvc;

import lombok.extern.log4j.Log4j2;
//import org.springframework.data.redis.core.RedisCallback;
//import org.springframework.data.redis.core.RedisTemplate;


@Log4j2
public class FansCacheHandler {

    //    private RedisTemplate redisTemplate;
//    private FansDataService fansDataService;
//    private static List<String> defaultResult = Arrays.asList("-1");
//    public static final String LOCK_PREFIX = "live:lock:%s";
//    public static final int LOCK_EXPIRE = 100;
//    private static String fansSet = "live:fans:change:%s";
//    private static String autoFansSet = "live:autoFans:change:%s";
//
//    public FansCacheHandler(RedisTemplate redisTemplate, FansDataService fansDataService) {
//        this.redisTemplate = redisTemplate;
//        this.fansDataService = fansDataService;
//    }
//
//    public Boolean cacheFans(CacheFansEntity entity) {
//        try {
//            redisTemplate.opsForHash().put(entity.getAnchorKey(), entity.getFansKey(), entity.getValue());
//            redisTemplate.opsForSet().add(entity.getDayAnchorFans(), entity.getAnchorId());
//            redisTemplate.opsForSet().add(String.format(fansSet, entity.getFansKey()), entity.getAnchorId());
//            loadingFans(entity);
//            increment(entity);
//            return true;
//        } catch (Exception e) {
//            log.error("cacheFans method anomaly  value :{}  Exception:{}", entity.toString(), e);
//            return false;
//        }
//    }
//
//    public Boolean cacheAutoFans(CacheFansEntity entity) {
//        try {
//            redisTemplate.opsForHash().put(entity.getAnchorKey(), entity.getFansKey(), entity.getValue());
//            redisTemplate.opsForSet().add(entity.getDayAutoAnchorFans(), entity.getAnchorId());
//            redisTemplate.opsForSet().add(String.format(autoFansSet, entity.getFansKey()), entity.getAnchorId());
//            loadingFans(entity);
//            increment(entity);
//            return true;
//        } catch (Exception e) {
//            log.error("cacheFans method anomaly  value :{}  Exception:{}", entity.toString(), e);
//            return false;
//        }
//    }
//
//    public void increment(CacheFansEntity entity) {
//        if (!redisTemplate.opsForHash().hasKey(entity.getAnchorFansCountKey(), entity.getAnchorId())) {
//            redisTemplate.opsForHash().put(entity.getAnchorFansCountKey(), entity.getAnchorId(), 0L);
//        }
//        if (lock(entity.getAnchorId())) {
//            incrementVal(entity);
//            delete(entity.getAnchorId());
//        } else {
//            Flux.generate(ArrayList::new, (val, sink) -> {
//                try {
//                    TimeUnit.MILLISECONDS.sleep(10L << 1);
//                    val.add(1);
//                    sink.next(val);
//                    if (val.size() > 8) {
//                        sink.complete();
//                        throw new CacheDataException("Unable to acquire object lock");
//                    } else if (lock(entity.getAnchorId())) {
//                        incrementVal(entity);
//                        delete(entity.getAnchorId());
//                        sink.complete();
//                    }
//                } catch (Exception e) {
//                    throw new CacheDataException(e);
//                }
//                return val;
//            }).doOnError(e -> log.error(e.getMessage(), e)).subscribe();
//
//        }
//    }
//
//    private void incrementVal(CacheFansEntity entity) {
//        Long val = Long.valueOf(redisTemplate.opsForHash().get(entity.getAnchorFansCountKey(), entity.getAnchorId()).toString());
//        redisTemplate.opsForHash().put(entity.getAnchorFansCountKey(), entity.getAnchorId(), val + entity.getValue());
//    }
//
//    public Long getAnchorFans(CacheFansEntity entity) {
//        loadingFans(entity);
//        return Long.valueOf(redisTemplate.opsForHash().get(entity.getAnchorFansCountKey(), entity.getAnchorId()).toString());
//    }
//
//    private void loadingFans(CacheFansEntity entity) {
//        if (!redisTemplate.opsForHash().hasKey(entity.getAnchorFansCountKey(), entity.getAnchorId())) {
//            long fansCount = fansDataService.getFans(entity);
//            if (fansCount == -2l) {
//                throw new CacheDataException("The getFans method is not initialized");
//            } else {
//                redisTemplate.opsForHash().put(entity.getAnchorFansCountKey(), entity.getAnchorId(), fansCount);
//            }
//        }
//    }
//
//    public Integer loadFansStatus(CacheFansEntity entity) {
//        if (redisTemplate.opsForHash().hasKey(entity.getAnchorKey(), entity.getFansKey())) {
//            return Integer.valueOf(redisTemplate.opsForHash().get(entity.getAnchorKey(), entity.getFansKey()).toString());
//        } else {
//            if (redisTemplate.opsForHash().hasKey(entity.getAllFansKey(), entity.getFansKey())) {
//                return Integer.valueOf(redisTemplate.opsForHash().get(entity.getAllFansKey(), entity.getFansKey()).toString());
//            } else {
//                Integer status = fansDataService.getFansStatus(entity);
//                if (Objects.isNull(status)) {
//                    redisTemplate.opsForHash().put(entity.getAllFansKey(), entity.getFansKey(), -1);
//                    return -1;
//                } else if (status == -2) {
//                    throw new CacheDataException("The getFansStatus method is not initialized");
//                } else {
//                    return status;
//                }
//            }
//        }
//    }
//
//    public List<String> loadInterestList(CacheFansEntity entity) {
//        return getFansInterestList(entity);
//    }
//
//    private List<String> getFansInterestList(CacheFansEntity entity) {
//        if (redisTemplate.hasKey(entity.getFansInterestListKey())) {
//            return redisTemplate.opsForList().range(entity.getFansInterestListKey(), 0, -1);
//        } else {
//            List<String> interestList = fansDataService.getFansInterestList(entity);
//            interestList = filterInterestList(entity, interestList);
//            if (Objects.isNull(interestList) || interestList.size() < 1) {
//                redisTemplate.opsForList().leftPushAll(entity.getFansInterestListKey(), defaultResult);
//                redisTemplate.expire(entity.getFansInterestListKey(), 10, TimeUnit.SECONDS);
//                return defaultResult;
//            }
//            redisTemplate.delete(entity.getFansInterestListKey());
//            redisTemplate.opsForList().leftPushAll(entity.getFansInterestListKey(), interestList);
//            redisTemplate.expire(entity.getFansInterestListKey(), 10, TimeUnit.SECONDS);
//            return interestList;
//        }
//    }
//
//    private synchronized boolean lock(String key) {
//        String lock = String.format(LOCK_PREFIX, key);
//        return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
//            if (connection.setNX(lock.getBytes(), String.valueOf(System.currentTimeMillis() + LOCK_EXPIRE + 1).getBytes())) {
//                connection.pExpire(lock.getBytes(), 400);
//                return true;
//            } else {
//                return Mono.justOrEmpty(connection.get(lock.getBytes())).map(value -> {
//                    if (Long.parseLong(new String(value)) < System.currentTimeMillis()) {
//                        byte[] oldValue = connection.getSet(lock.getBytes(), String.valueOf(System.currentTimeMillis() + LOCK_EXPIRE + 1).getBytes());
//                        connection.pExpire(lock.getBytes(), 400);
//                        return Long.parseLong(new String(oldValue)) < System.currentTimeMillis();
//                    }
//                    return false;
//                }).doOnError(Exception -> log.error(Exception.getMessage(), Exception)).block();
//            }
//        });
//    }
//
//    private List<String> filterInterestList(CacheFansEntity entity, List<String> interestList) {
//        Set<String> dayAnchorFans;
//        if (redisTemplate.opsForSet().size(String.format(autoFansSet, entity.getFansKey())) > 100) {
//            dayAnchorFans = redisTemplate.opsForSet().members(String.format(fansSet, entity.getFansKey()));
//        } else {
//            dayAnchorFans = redisTemplate.opsForSet().union(String.format(fansSet, entity.getFansKey()), String.format(autoFansSet, entity.getFansKey()));
//        }
//        dayAnchorFans.forEach(anchor -> {
//            if (redisTemplate.opsForHash().hasKey(String.format("live:fcuson:%s:fans:list", anchor), entity.getFansKey())) {
//                if (redisTemplate.opsForHash().get(String.format("live:fcuson:%s:fans:list", anchor), entity.getFansKey()).equals(1l)) {
//                    interestList.add(anchor);
//                } else {
//                    interestList.remove(anchor);
//                }
//            }
//        });
//        return interestList.stream().distinct().collect(Collectors.toList());
//    }
//
//    private void delete(String key) {
//        redisTemplate.delete(String.format(LOCK_PREFIX, key));
//    }
}
